package com.javaExtendsDemo.demo2;

/**
 * Java 继承详解 | 菜鸟教程
 * https://www.runoob.com/w3cnote/java-extends.html
 * <p>
 * 抽象（abstract）
 * 抽象就是从多个事物中将共性的，本质的内容抽象出来。
 * <p>
 * 抽象类：
 * <p>
 * Java中可以定义没有方法体的方法，该方法的具体实现由子类完成，该方法称为抽象方法，包含抽象方法的类就是抽象类。
 * <p>
 * 由来：
 * <p>
 * 多个对象都具备相同的功能，但是功能具体内容有所不同，那么在抽取过程中，只抽取了功能定义，并未抽取功能主体，那么只有功能声明，没有功能主体的方法称为抽象方法。
 * <p>
 * 抽象类特点：
 * <p>
 * 抽象方法一定在抽象类中；
 * 抽象方法和抽象类都必须被abstract关键字修饰；
 * 抽象类不可以用new创建对象，因为调用抽象方法没意义；
 * 抽象类中的抽象方法要被使用，必须由子类复写其所有的抽象方法后，建立子类对象调用； 如果子类只覆盖了部分的抽象方法，那么该子类还是一个抽象类；
 * 抽象类中可以有抽象方法，也可以有非抽象方法，抽象方法用于子类实例化；
 * 如果一个类是抽象类，那么，继承它的子类，要么是抽象类，要么重写所有抽象方法。
 * 特殊：抽象类中可以不定义抽象方法，这样做仅仅是不让该类建立对象。
 * 抽象类的成员特点：
 * <p>
 * 成员变量：可以是变量，也可以是常量；
 * 构造方法：有构造方法；
 * 成员方法：可以是抽象方法，也可以是非抽象方法。
 * <p>
 * 抽象类注意事项：
 * <p>
 * 抽象类不能被实例化，为什么还有构造函数？
 * <p>
 * 只要是class定义的类里面就肯定有构造函数。抽象类中的函数是给子类实例化的。
 * <p>
 * 一个类没有抽象方法，为什么定义为抽象类?
 * <p>
 * 不想被继承，还不想被实例化。
 * <p>
 * 抽象关键字abstract不可以和哪些关键字共存？
 * <p>
 * final：如果方法被抽象，就需要被覆盖，而final是不可以被覆盖，所以冲突。
 * private：如果函数被私有了，子类无法直接访问，怎么覆盖呢？
 * static：不需要对象，类名就可以调用抽象方法。而调用抽象方法没有意义。
 */
public class AbstractTest {
    public static void main(String[] args) {
        岳不群 岳 = new 岳不群();
        岳.自宫();

        林平之 林 = new 林平之();
        林.自宫();
    }

//    用剪刀自宫了
//    用指甲刀自宫了
}

abstract class 葵花宝典 {
    public abstract void 自宫();
}

class 岳不群 extends 葵花宝典 {
    public void 自宫() {
        System.out.println("用剪刀自宫了");
    }
}

class 林平之 extends 葵花宝典 {
    public void 自宫() {
        System.out.println("用指甲刀自宫了");
    }
}